const { WebSocketServer } = require("ws"); //  引入WebSocketServer模块
const Websocket = require("ws");
const WebSocket = require("ws"); //  引入WebSocket模块

const onLineList = []; //  定义一个在线用户列表

// 我们的port是8090
const wss = new WebSocket.Server({ port: 8080 });

// 如果有ws就代表初始化成功
if (wss) {
  console.log("ws初始化成功");
}

wss.on("connection", function connection(ws, request) {
  let welCome = JSON.stringify({
    type: "tips",
    content: "欢迎加入聊天室，现在我们开始畅聊吧"
  });

  ws.send(welCome, { binary: false });

  ws.on("error", (error) => {
    console.log("WebSocket error:", error);
  });

  //   注册收到消息的事件
  ws.on("message", async function message(data) {
    const message = JSON.parse(data); //  将收到的数据解析为JSON格式
    switch (
      message.type //  根据消息类型进行不同的处理
      ) {
      case "init":
        if (message.userId) {
          //  如果消息中包含用户id
          // 为当前的用户  ws链接绑定 用户id，用于用户断开连接时，改变用户状态
          ws.userId = message.userId;
          // 上线
          keepLatestOnlineList("onLine", message);
        }
        break;
      case "message":
        wss.clients.forEach(client => {
          //  遍历所有客户端
          if (client.readyState === Websocket.OPEN) {
            //  如果客户端处于打开状态
            client.send(JSON.stringify(message), { binary: false }); //  发送消息
          }
        });
        break;
      default:
        break;
    }
  });
  //   被动断开说明用户已经离开网站了 维护在线列表
  ws.on("close", function() {
    keepLatestOnlineList("close", { userId: ws.userId });
  });
});

function keepLatestOnlineList(type, message) {
  let index = onLineList.findIndex(item => item.userId === message.userId); //  在在线列表中查找用户
  switch (type) {
    case "onLine":
      if (index === -1) {
        //  如果用户不在在线列表中，则添加用户
        onLineList.push({ userId: message.userId });
      }
      break;
    case "close":
      if (index !== -1) {
        //  如果用户在在线列表中，则删除用户
        onLineList.splice(index, 1);
        console.log("有客户被断开");
      }
      break;
    default:
      break;
  }
}
